游戏安全


方法论参考

常用加密算法比较

https://www.cnblogs.com/sunxuchu/p/5483956.html

  1. 常见加密算法

    1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合; 
    2、3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
    3、RC2和RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
    4、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
    5、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法; 
    6、DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法;
    7、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael 算法;
    8、BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
    9、MD5:严格来说不算加密算法,只能说是摘要算法;
    10、PKCS:The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
    11、SSF33,SSF28,SCB2(SM1):国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用;
    12、ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。
    13、TEA(Tiny Encryption Algorithm)简单高效的加密算法,加密解密速度快,实现简单。但安全性不如DES,QQ一直用tea加密
    
  2. 对称加密算法(加解密密钥相同)

名称 密钥长度 运算速度 安全性 资源消耗
DES 56位 较快
3DES 112位或168位
AES 128、192、256位
  1. 非对称算法(加密密钥和解密密钥不同)
名称 成熟度 安全性(取决密钥长度) 运算速度 资源消耗
RSA
DSA 只能用于数字签名
ECC 低(计算量小,存储空间占用小,带宽要求低)
公钥(pubkey)、私钥(privkey)是什么

公开密钥加密(public-key cryptography,也称为非对称(密钥)加密),是指存在一对数学算法相关的密钥,使用其中一个密钥加密后所得的信息,只能用另一个密钥才能解密。如果其中一个公开后并不会危害到另外一个的秘密性质,则称公开的密钥为公钥,不公开的密钥为私钥。

  公钥的主要作用:加密;验证签名。
  私钥的主要作用:签名;解密。

特性:

    通过私钥可以计算出公钥,反之则不行。
    公钥加密:公钥加密的内容可以用私钥来解密——只有私钥持有者才能解密。
    私钥签名:私钥签名的内容可以用公钥验证。公钥能验证的签名均可视为私钥持有人所签署。
  1. 散列算法比较
名称 安全性 速度
SHA-1
MD5
  1. 算法选择(从性能和安全性综合)

    对称加密: AES(128位),
    非对称加密: ECC(160位)或RSA(1024),
    消息摘要: MD5
    数字签名:DSA
    轻量级:TEA、RC系列(RC4),Blowfish (对称加密, 不常换密钥)
    速度排名(个人估测,未验证):IDEA<DES<GASTI28<GOST<AES<RC4<TEA<Blowfish  
    
  2. 简单的加密设计: 用密钥对原文做 异或,置换,代换,移位

Denuvo全称Denuvo Anti-Tamper(反篡改)

https://www.zhihu.com/question/31592040

  1. Denuvo反篡改系统主要由两部分组成

    • 游戏启动时的授权认证模块

      Denuvo会在玩家第一次启动游戏时把PC的硬件和操作系统信息发送至Denuvo的服务器以取得独一无二的认证密钥(License)存储在本地,每次游戏启动时都会检查该授权密钥是否和当前运行环境匹配

      Denuvo的授权认证模块和PC的硬件信息绑定

    • 游戏运行中的篡改检测模块

      游戏中内置的多处触发器还会在游戏运行中进行篡改检测,一旦授权校验失败或检测到了游戏被篡改,游戏就会终止运行或游戏玩法发生改变。

      Denuvo公司为了阻止玩家滥用Steam游戏共享功能,便采取了每日激活上限的限制,同一个Steam账号每天只能在最多5台不同的电脑上激活游戏授权。

      利用Steam免费试玩的漏洞(把游戏伪装成《毁灭战士试玩版(DOOM Demo)》)成功绕过了Denuvo的保护机制

  2. 三大数字管理平台(Steam、Origin和Uplay)

  3. 意大利老牌破解小组CPY

    CPY并没有修改游戏可执行文件,而是通过加载特制的dll文件来修改内存,使可执行文件中的保护机制失效。也就是说CPY只是绕过Denuvo,没有彻底地从exe上移除Denuvo的代码模块。

    该破解组更倾向于破解评价较高的游戏、规模较大的游戏公司的游戏、日本系游戏。

  4. “这场猫和老鼠的游戏会一直持续下去”

    每当有游戏被破解时,Denuvo公司的雇员就会去下载破解补丁并且去研究破解者是如何成功实现破解的,然后进行反制。

  5. 破解原理

    Denuvo反篡改技术会在游戏内置许多检测游戏是否被篡改的触发器,而这些触发器是基于VMProtect虚拟机的。或许有人听说过VMProtect——很多病毒、木马程序都通过VMProtect进行加壳来逃避杀毒软件基于病毒特征码的检测。同样的原理,想要破解Denuvo游戏,就需要找出其特征码,就像杀毒软件公司分析病毒特征码那般。

    目前为止仍然只有CPY破解组能攻破当前版本的Denuvo反篡改技术,原因只可能是CPY成功找到了Denuvo游戏中大量复杂的触发器的特征码。可以想象的到,触发器的特征码一定极其复杂难以被发现,所以只有CPY破解组能成功找到。

    CPY的破解文件(steamapi64.dll)只是把所有的触发器给禁用掉,我们不知道CPY是如何成功找出触发器的,所以对于Denuvo的开发人员来说,他们也不知道CPY掌握到了触发器的哪些特征码,因此CPY的破解方法难以在短时间内修复。这就好比,老师给你出了一道高数大题,然而你只写了最终计算结果,老师看不到你的计算过程、不知道你是如何得出最终答案的。

    所以,Denuvo公司要想隐藏触发器的特征码,就必须得从底层重写触发器的构造——这就是为什么在2017年新版Denuvo中,触发器所依赖的虚拟机从VMProtect换成了全新的自制虚拟机。而使用v4版本的《质量效应:仙女座》的破解,证明自制虚拟机仍然有破绽。

  6. Denuvo授权价格【未经证实但可信度较高】

    有两种付费模式:

    一次性支付费用的包干模式 
    
    AAA大作(安装量 大于50万):10万欧元
    AA级游戏(安装量介于10万到50万):5万欧元
    独立游戏(安装量 小于10万):1万欧元
    
    按游戏安装量付费
    
    初始费用:2500欧元
    每套拷贝:0.15欧元(安装量基于Steam等平台的月度用户数据报告)
    

单机手游如何防破解? 分享几点简单的防护措施

http://www.gameres.com/673755.html

  1. 内存加密

    一种是加密存储一些关键性数值,每次代码中要读取/赋值也都要走一遍加密/解密的步骤,内存中永远存放的是密文。

    最好还是在内存中放一份明文的数值,让玩家可以搜到,当然等他们改了你就能知道,因为和密文对比不一致,然后就能知道这个家伙是个作弊玩家了。

  2. 存档加密

    游戏存档最好加密进行存储,而且最好使用密钥加密的算法来做而不要把加密解密算法写死。这样以后哪天发现被破解了可以再更换密钥。

  3. 存档绑定

    一种是在玩家第一次玩游戏存档被创建的时候把这台设备的device id也写到存档里,之后每次要读存档的时候都比较存档里的device id和本机的device id是否一致,不一致则不让进游戏或者开启新的存档;

    另一种方式是把本机的device id来作为加密存档的密钥来使用,这样存档被拷贝到别的机器上之后也是无法正常读取的。

  4. 内购验证,强制更新,改时间限制,代码混淆

  5. 迁存档限制

  6. 密钥必须有一定的随机性

网络游戏开发之安全对抗

http://bbs.gameres.com/thread_698399_1_1.html

  1. 常见外挂对抗

    这里列举下网络游戏影响较大的3类外挂,分别做说明:

       1)产生经济利益的
    
       a. 利用游戏漏洞获取经济利益
    
       游戏漏洞,这是最常见且最致命的外挂了。尽管做了足够多的代码review、大量的测试,还是无法完全避免漏洞的出现。
    
       对付这种外挂,比较常用的对抗策略是:
    
       1、玩家收益预警,高出预估值的收益做预警
    
       2、安全日志的记录,遇到玩家作弊,能快速定位问题,热修复
    
       3、根据玩家举报,查看被举报玩家数据及日志。(这个看似没用,实际效果显著。游戏中的获利最终要转化成现金,这样他们就要给玩家推销)
    
       b. 利用运营弱点获取经济利益
    
       游戏为了增加留存,某些场景必然实打实给玩家送福利。工作室就利用这些场景反复刷获益。
    
       对付这种外挂,比较常见的对抗策略是:
    
       1、划分新手区,高等级玩家无法到新手区
    
       2、限制没充值的,且刚注册不久的玩家
    
       3、限制领奖次数(这是广义的,除了游戏中明确每人只能领几次,还包括内定限制)
    
       2)减少重复劳动的
    
       游戏为了增加玩家的在线时长,有很多重复性的劳动,比如任务打怪200只、收集道具50个。像这些,外挂可以帮玩家自动打怪,自动收集道具,自动交任务,自动接任务,然后再重复这个过程。
    
       对付这种外挂,比较常见的对抗策略是:
    
       1、适当增加内挂,即游戏内置的自动挂机
    
       2、增加此类任务的随机性,变换任务数量、场景
    
       3、随机增加一些确认对话框,如验证码
    
       3)影响游戏平衡的
    
       这种外挂,在竞技类游戏较为常见,如CF透视外挂、CF自动瞄准、LOL野怪计时、LOL技能闪避、王者荣耀透视外挂。像这些外挂,影响了游戏平衡。
    
       对付这种外挂,比较常见的对抗策略是:
    
       1、加强客户端对外挂的检测
    
       2、根据外挂盈利点优化游戏,如LOL增加了野怪刷新提示
    
       3、内存数据加密 (自定义的安全类型,用来代替语言原生的int、string等类型进行数据存储,还可重载运算符。这种可以有效对抗内存修改器)
    
       4、客户端加壳(增加反编译的成本,减少游戏被反编译的可能性)
    
       5、协议加密(增加修改协议的成本)
       
    
  2. 安全日志对抗

       安全日志有别于游戏日志,是关系到游戏经济、游戏公平的玩家行为日志。
    
       为什么要有安全日志?
    
       你知道一个玩家有问题,但没有日志支撑,你不知道他怎么获利的,是否真的不符游戏规定。另外,还可以根据这个玩家的特征,找到其他作弊玩家。
    
       安全日志采集那些数据:
    
       根据玩家的获利点:
    
       1、游戏币:游戏币的获得与使用,需要记录理由、增量、总量、时间
    
       2、道具:道具的获得与使用,需要记录理由、增量、总量、时间
    
       3、技能:比如技能释放次数、技能释放的最大范围,技能命中目标总数、单个技能命中目标最大数、单个技能的获利值、技能消耗的能量总数、技能的最大伤害、技能的总伤害
    
       4、怪物:怪物的产出数量、被击败数量、受创值、受创次数、初始地图位置、被击败位置
    
       5、玩法:每个玩法的情况,包括初始游戏币、结束时间、分数、获得游戏币,获得道具、对局时长、客户端对局时长
    
       6、交易:交易双方的信息、交易道具、交易游戏币、时间
    
       当然,安全日志不止这些,需要根据不同游戏,制定不同的安全日志。
    
  3. 安全预警对抗

       这是在安全日志的基础上做的预警,比如刚注册当天没充值就获利1亿游戏币,这种玩家就需要预警了。预警的目的在于查找可能作弊的玩家,提醒运营人员发现作弊玩家,就好像美剧《疑犯追踪》
    
       安全预警的手段主要有两种:
    
       1、线上预警:线上即时预警,对一些对局、或产出数值严重超过预警值的要预警,这种是线上统计,在玩家上报分数及发奖时hook处理
    
       2、离线预警:作弊玩家收益可能不是一两局比赛就得到了,可能要累计一段时间反复刷获得大量收益。所以要离线分析,通过分析安全日志,定制一些规则找到这些玩家。
    
       根据作弊玩家的行为:
    
       1、贫民富翁:刚注册当天没充值就获利巨额游戏币
    
       2、一夜暴富:一天获得的游戏币数额超过同等玩家N倍,且没有充值、没有交易
    
       3、明目张胆:对于排行榜前N名的玩家重点关注
    
       4、百战百胜:没有玩家是百战百胜的,屡次都是前几名,这样的玩家多数是有问题的
    
       5、雨后春笋:刚放出去的功能还没有受到实战考验,出错的可能性很大,要监控产出,针对一个功能设置当日产出预警值
    
       当然,安全日志不止这些,需要根据不同游戏,制定不同的安全日志。
    
  4. 帐号封禁对抗

       如果确定了玩家行为严重违反了游戏规则,就要考虑封禁玩家。封禁主要的好处是,将作弊太猖狂的玩家踢出众人视野。同时封禁的存在,相当于告诉玩家别使用外挂。除了这两个,还可以有效对抗游戏工作室转移资产,提高作弊成本。有一大部分工作室是靠售卖游戏货币、道具、高级游戏账号为生,而经营工作室又需要大量的成本,购置机器、网络、员工、游戏账号等,如果大量账号被封,可能会导致工作室周转遇到问题
    
       封禁类别:
    
       1、限制登录:限制玩家无法登录游戏,也就是封号。短时间封禁、永久封禁
    
       2、限制玩法:限制玩家获得收益、限制分数上榜
    
       3、限制聊天:屏蔽不良信息
    
       封禁的难点是,怎么筛选出有作弊的玩家,避免误伤正常玩家:
    
       1、刚注册,就有作弊行为,是封禁的重点,特别是收益巨大的
    
       2、长时间在线的,每天日活跃达到15小时以上,甚至23小时以上
    
       3、充值较大的玩家,就算使用过作弊器,影响不大的,也可以忽略。(毕竟是衣食父母,适当给于提示或警告)
    
       4、同个设备号,或同个ip的多个玩家帐号都有作弊数据
    
       5、游戏日志、或安全日志有较多的作弊日志
    
  5. 策划层面对抗

       1、增加交易成本,限制玩家交易
    
       增加交易成本是很有效的,工作室通常就利用多个小号刷,再汇总到一起售卖。限制的方法很多,如等级开放(30级开启),或VIP2开放,需充值多少钱可达到。或交易扣手续费
    
       2、玩法(或功能)设定数值上限
    
       每一关的最大分数,每个技能的最大伤害等,就算属性过多或其他理由,也要计算好这个上限,做出限制。不要单纯为了体验的东西,太大放宽这个限制。
    
       3、玩法(或交易)次数限制
    
       玩法如每人每天只能玩3次,交易如VIP2每天可交易2个道具、VIP3每天可交易5个道具。
    
       4、限制较大收益路径,必须有时间成本
    
       工作室经常都会研究出最快获利的路径,定制外挂获利。那么这个收益路径,必须要有时间成本,比如虽然是概率出,但还是限制了一天最多一次。
    
       5、降低重复性任务所获得收益
    
       很多外挂是通过长时间刷来累计收益,正常玩家不会长时间重复无脑劳动。对于同一种任务的收益,应该随时间增加而减少
    
       6、适当提供自动挂机功能
    
       游戏中很多任务是重复性的,可以适当提供自动挂机。
    
  6. 其他技术对抗

       1、客户端加壳(增加反编译的成本,而且,不同版本加壳做一点变化)
    
       2、通信加密(增加修改协议的成本,而且,密匙要不定期更新。或者,密匙可做成动态的,比如自增1)
    
       3、内存数据加密 (自定义的安全类型,用来代替语言原生的int、string等类型进行数据存储,还可重载运算符。这种可以有效对抗内存修改器)
    
       4、协议通信频率限制(限制同一个协议两次请求的间隔)
    
       5、防加速(客户端连接服务器后,服务器把当前时间发给客户端,以后客户端发协议都加上自己算出的服务器时间,服务器检测到这个时间超过了实际时间,就认为加速)
    
       6、顶号、重复登录处理(必须将上次登录踢出,并且数据保存完毕后,才允许本次登录)
    
       7、关键数据服务器校验(如技能CD、移动速度及位置)
    
       8、定期上报客户端核心资源或者配置文件md5,服务端做校验
    
       9、客户端配置文件、资源文件加密
    
       10、协议过期(避免截取客户端发包,重复发送)
    

游戏协议加密及身份验证

https://www.cnblogs.com/Lifehacker/p/mobile_game_protocol_encrypt_and_authentication.html

  1. 鉴权的框架:

    • 客户端连接服务器
    • 服务器将随机数发给客户端
    • 客户端用客户端私钥加密,发回到服务器
    • 服务器端用客户端公钥解开密文,比对解开的随机数是否与原来的一致
    • 如果一致,则客户端发送随机数到服务器,服务器用服务器端私钥加密,将密文发送到客户端;同时,产生新的随机数,用于稍后对会话进行rc4加密,并将这个随机数以客户端公钥加密,发送到客户端。
    • 客户端用服务器端公钥解开密钥,比对随机数和自己发的是否相同,相同的话则用客户端私钥解开下一个包,取出用于rc4加密的key密文
    • 至此,双方身份验证完成,会话先进行压缩,再通过rc4算法进行加密
  2. 新的验证流程如下:

    • 客户端连接服务器
    • 服务器用客户端公钥加密随机数,发给客户端
    • 客户端用客户端私钥解密,发回服务器
    • 服务器对比随机数,不一样的话就断开连接
    • 客户端用服务器端公钥加密随机数,发送到服务器
    • 服务器用私钥解密,发送回客户端
    • 客户端验证通过
    • 服务器用客户端公钥加密rc4会话所用密钥,发送到客户端
    • 客户端用公钥解开,接下来在rc4加密下上传

技术细节